package main

import "fmt"

type CTMError struct {
	Msg  string
	File string
	Line int
}

func (ce *CTMError) Error() string {
	return fmt.Sprintf("%s:%d: %s", ce.File, ce.Line, ce.Msg)
}

func test() error {
	return &CTMError{
		"something happened",
		"server.go",
		30,
	}
}

func main() {
	err := test()
	// 因为CTMError是结构体类型，所以可以使用断言转换类型
	switch e := err.(type) {
	case nil:
	case *CTMError:
		fmt.Println("error occured on line: ", e.Line)
	}
}
